//!
/**
 ***********************************************************************************************************
 * <RBEntity implementation>
 ***********************************************************************************************************
 * @file RBEntity.cpp
 ***********************************************************************************************************/

/************************************************************************************************************
 * Includes
 ************************************************************************************************************/
#include "RBMainPCH.h"
#include "RBEntity.h"

#include "RBComponent.h"

/************************************************************************************************************/

std::vector<RBEntity> RBEntity::Instances;

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
RBEntity::RBEntity(RBEntityHandle handle)
: m_entity(handle)
{
    m_aComponents.resize(RBComponent::g_componentCount);

}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
RBEntity::~RBEntity()
{

}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
void RBEntity::CreateEntity(RBEntityHandle* handles, uint32 count)
{
    for (uint32 ui=0; ui<count; ++ui)
    {
        handles[ui] = CreateEntity();
    }
}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
RBEntityHandle RBEntity::CreateEntity()
{
    RBEntityHandle handle = (RBEntityHandle)Instances.size();
    Instances.push_back(RBEntity(handle));
    return handle;
}

#pragma TODO("Handle correctly entity destruction")
/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
void RBEntity::DestroyEntity( RBEntityHandle /*handle*/ )
{

}

/***********************************************************************************************************
 * 
 ***********************************************************************************************************/
RBEntity& RBEntity::Get( RBEntityHandle handle )
{
    return Instances[handle];
}

uint16 RBEntity::AddComponents( uint32 componentID, uint16* handles, uint32 count )
{
    uint16 startIdx = (uint16)m_aComponents[componentID].size();
    for (uint32 ui=0; ui < count; ++ui)
    {
        m_aComponents[componentID].push_back(handles[ui]);
    }
    return startIdx;
}

uint16 RBEntity::GetComponent( uint32 componentID, uint16 idx ) const
{
    return m_aComponents[componentID][idx];

}

uint16 RBEntity::GetComponentCount( uint32 componentID ) const
{
    return (uint16)m_aComponents[componentID].size();
}